11. 理解预训练

可以把整个预训练过程理解成:教一个学生玩无限规模的“词语接龙”游戏。


一句话理解预训练

预训练其实只干一件事:

给你前面的内容,你猜下一个字(Token)是什么。

例如:

人工智能是计算机科学的一个

让模型猜:

然后继续:

人工智能是计算机科学的一个分

猜:

再继续:

人工智能是计算机科学的一个分支

猜:

这就是 LLM 最核心的训练目标:

Next Token Prediction(预测下一个 Token)


为什么只玩接龙就能学会知识?

很多人第一次学都会困惑:

只猜下一个字,为什么最后会懂数学、代码、历史?

因为训练数据太大了。

假设模型读过:

北京是中国的首都

很多次。

那么:

北京是中国的

后面最可能是什么?

模型发现:

首都

出现概率极高。

于是参数被调整。


再比如:

1+1=

后面经常是:

2

于是模型学会:

P(2 | 1+1=) 很大

再比如:

苹果公司的创始人是

后面经常接:

乔布斯

于是模型记住了这个知识。


所以:

世界知识 = 海量接龙过程中统计出来的规律

并不是有人把知识库塞进去。


为什么叫自回归(Autoregressive)

比如一句话:

我 爱 学 习 AI

模型训练时实际上在做:


任务1:

输入:我
输出:爱

任务2:

输入:我 爱
输出:学

任务3:

输入:我 爱 学
输出:习

任务4:

输入:我 爱 学 习
输出:AI

一句话被拆成很多很多个接龙任务。

所以:

整句话概率 = 每一步接龙概率的乘积

这就是公式:

P(x1,x2,...,xn)=P(xt|token)

本质上就是:

整篇文章 = 一连串接龙


Loss 到底在干什么?

模型猜完以后,要知道:

猜得好不好?

这时候就需要 Loss。


假设词表里有三个词:

苹果
香蕉
西瓜

真实答案是:

苹果

模型第一次预测:

苹果 0.9
香蕉 0.05
西瓜 0.05

这说明:

模型很有把握

Loss 很小。


如果预测:

苹果 0.01
香蕉 0.8
西瓜 0.19

说明:

模型完全猜错

Loss 很大。


所以:

Loss 就是“扣分器”

猜得越准:

Loss 越小

猜得越离谱:

Loss 越大

为什么是 -log(P)?

公式:

Loss=log(P)

看几个例子:

正确答案概率P Loss
1.0 0
0.9 0.046
0.5 0.3
0.1 1
0.01 2

发现:

猜得越准

P ↑
Loss ↓

猜错时

Loss增长特别快

例如:

0.1 → 1
0.01 → 2

这样模型会被狠狠惩罚。

所以交叉熵非常适合分类任务。


反向传播到底在干什么?

训练时:

预测
↓
计算Loss
↓
反向传播
↓
更新参数

例如:

模型预测:

香蕉

真实答案:

苹果

Loss 很大。


反向传播会告诉模型:

你刚才哪些神经元导致了错误?

然后把这些参数微调一点。

例如:

W = 0.5

更新后:

W = 0.5001

每次只改一点点。

但训练几千亿次后:

模型越来越准

学习率是什么?

可以理解成:

每次改作业改多少


如果学习率太大:

答案在10

你从0跳到20
又跳到5
又跳到30

来回乱飞。

训练崩掉。


如果学习率太小:

0
0.0001
0.0002
0.0003

训练特别慢。


所以需要一个合适的学习率。


Warmup 为什么有必要?

刚开始训练时:

模型参数完全随机

这时候梯度特别不稳定。

如果直接大学习率:

第一步就把参数干飞

Loss 直接爆炸。


于是前几百步:

学习率从0慢慢涨

例如:

0
→ 1e-6
→ 2e-6
→ 3e-6
→ ...
→ 1e-4

这就是 Warmup。

本质:

先热车,再踩油门


余弦退火是什么?

训练后期需要越来越谨慎。

类似考试改作文:

刚开始:

大胆修改

后面:

微调细节

学习率曲线:

      /\
     /  \
    /    \
   /      \
__/        \____

先升:

Warmup

再缓慢下降:

Cosine Decay

作用:

前期学得快。

后期学得稳。


AMP 混合精度是什么?

可以理解成:

用更省空间的数字做计算

原来:

FP32

占:

32位

现在:

BF16

只需要:

16位

好处:

显存减半

例如:

24GB
→
能装更多数据

GPU更快

因为 3090、A100、H100 都有专门硬件。

训练速度明显提升。


所以现代大模型训练几乎都在用:

BF16

梯度裁剪是什么?

可以理解成:

给梯度加保险丝


正常情况:

梯度 = 0.5

更新:

参数 -= 学习率 × 0.5

很正常。


某个异常 Batch:

梯度 = 50000

这时:

参数直接飞掉

训练崩溃。


于是:

clip_grad_norm_(..., 1.0)

意思:

超过1.0
就压回1.0

像限速器一样。


输入和标签为什么错开一位?

原句:

A B C D E

训练时:

输入:

A B C D

标签:

B C D E

对应关系:

输入 目标
A B
A B C
A B C D
A B C D E

这样才能训练:

根据前文预测后文


PPL(困惑度)是什么?

公式:

PPL=eLoss

可以简单理解:

模型平均有多少种选择拿不准

例如:

PPL = 2

表示:

平均只在2个词之间犹豫

很厉害。


PPL = 100

表示:

平均在100个词之间乱猜

很差。


所以:

Loss ↓
PPL ↓
模型 ↑

整个预训练流程其实就五步

① 输入一句话

② 做接龙预测

③ 算Loss(扣分)

④ 反向传播(找错误原因)

⑤ 更新参数

然后重复:

几十万步
几百万步
几千万步

最终得到一个:

会续写
会语言理解
会代码
会数学
会常识

的大模型。

但此时它本质上仍然只是一个超级接龙机。

所以预训练结束后,还需要:

SFT(监督微调)
↓
RLHF/RLAIF
↓
ChatGPT式助手

把“会续写文章”训练成“会对话回答问题”。